package com.winit.commons.util;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.StringUtils;

/**
 * 生成menu、page和功能点的编号
 */
public class NumberUtil {

    private static Logger log = LoggerFactory.getLogger(NumberUtil.class);

    /**
     * 生成menu、page和功能点的编号
     *
     * @param sys    系统  可选值:tom、opc
     * @param parent 上级的编号，可以为空
     * @param type   编号类型
     * @param index  当前节点所在序号，从1开始
     * @return
     * @throws Exception
     */
    public static String createNumber(SysEnum sys, String parent, TypeEnum type, Integer index) throws Exception {
        String number = "";
        if (StringUtils.isEmpty(sys) && StringUtils.isEmpty(parent)) {
            log.error("com.winit.commons.util.NumberUtil.createNumber sys 和 parent同时为空");
            throw new Exception("参数 sys 和 parent 不能同时为空");
        }
        if (StringUtils.isEmpty(index) || index == 0) {
            log.error("com.winit.commons.util.NumberUtil.createNumber index为空.index=" + index);
            throw new Exception("参数 index 不能同时为空,也不能为0");
        }
        if (StringUtils.isEmpty(type)) {
            log.error("com.winit.commons.util.NumberUtil.createNumber type为空");
            throw new Exception("参数 type 不能同时为空");
        }
        if (!StringUtils.isEmpty(parent)) {
            if (parent.toUpperCase().startsWith("ROOT")) {
                if (type != TypeEnum.MENU) {
                    log.error("com.winit.commons.util.NumberUtil.createNumber 根节点下只能添加menu。type=" + type);
                    throw new Exception("根节点下只能添加menu类型");
                }
                number = parent.toUpperCase().replace("ROOT-", "") + getTypeNum(type, index);
            } else {
                number = parent + getTypeNum(type, index);
            }
        } else {
            if (!type.equals(TypeEnum.MENU)) {
                log.error("com.winit.commons.util.NumberUtil.createNumber 参数parent为空时，type 只能是TypeEnum.MEN.type=" + type);
                throw new Exception("参数parent为空时，type 只能是TypeEnum.MENU");
            }
            number = sys + getTypeNum(type, index);
        }
        return number;
    }

    private static String getTypeNum(TypeEnum type, Integer index) throws Exception {
        String number = "";
        switch (type) {
            case MENU:
                number = getNum(index);
                break;
            case PAGE:
                number = "P" + getNum(index);
                break;
            case FEATURE:
                number = "F" + getNum(index);
                break;
            default:
                log.error("com.winit.commons.util.NumberUtil.getTypeNum type错误.type=" + type);
                throw new Exception("参数type错误.type=" + type);
        }
        return number;
    }

    private static String getNum(Integer index) {
        String number = "";
        if (index.toString().length() == 1) {
            number = "00" + index;
        } else if (index.toString().length() == 2) {
            number = "0" + index;
        } else {
            number = "" + index;
        }

        return number;
    }

    public enum SysEnum {
        TOM, OPC,MATRIX,WHO
    }

    public enum TypeEnum {
        MENU, PAGE, FEATURE
    }

    public static void main(String[] args) {
        try {
            System.out.println(createNumber(SysEnum.TOM, "ROOT-ttt", TypeEnum.MENU, 31));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}
